#include <stdlib.h>
#include "./LinkedQueue.h"

// 初始化
Status InitQueue(LinkedQueue *queue) {
    // 头结点
    Node *tmp = (Node*)malloc(sizeof(Node));
    if(!tmp) {
        return ERROR;
    }

    // 默认, 队头队尾都指向头结点
    queue->front = queue->rear = tmp;
    return OK;
}

// 销毁
Status DestroyQueue(LinkedQueue *queue) {
    // 将要销毁的结点
    // Node *p = queue->front;

    // while(p) {
    //     queue->front = p->next;
    //     free(p);
    //     p = queue->front;
    // }
    // queue->front = queue->rear = NULL;
    // return OK;

    // 简写
    while(queue->rear = queue->front) {
        queue->front = queue->front->next;
        free(queue->rear);
    }
    return OK;    
}

// 置空
Status MakeEmptyQueue(LinkedQueue *queue) {
    // if(queue->front == queue->rear) {
    //     // 空表情况
    //     return OK;
    // }
    // Node *p = queue->front->next;
    // while(p) {
    //     queue->front->next = p->next;
    //     free(p);
    //     p = queue->front->next;
    // }

    // 简写
    if(queue->front == queue->rear) {
        // 空表情况
        return OK;
    }
    while(queue->rear = queue->front->next) {
        queue->front->next = queue->rear->next;
        free(queue->rear);
    }
    return OK;
}

// 入队
Status EnQueue(LinkedQueue *queue, ElemType e) {
    Node* tmp = (Node*)malloc(sizeof(Node));
    if(!tmp) {
        return ERROR;
    }
    tmp->data = e;
    tmp->next = NULL;
    queue->rear = tmp;
    return OK;
}

// 出队
Status DeQueue(LinkedQueue *queue, ElemType *e) {
    if(queue->front == queue->rear) {
        // 空队情况
        return ERROR;
    }

    Node *p = queue->front->next;
    *e = p->data;
    queue->front = p->next;

    // 特殊处理, 如果队列中只有一个元素时, 再删除就为空了, 空队情况, 此时队头和队尾都指向头结点
    if(queue->rear == p) {
        queue->rear = queue->front;
    }

    free(p);
    return OK;
}

// 取队头元素
ElemType GetHead(LinkedQueue queue) {
    if(queue.front == queue.rear) {
        return ERROR;
    }
    return queue.front->data;
}

int main() {
    return 0;
}